🎖️GitЯра🎖️
src/helpers/ClientACL.cpp 890a2e2cffa98dea3ca88db3c3aba72ef23ff3f7 (890a2e2c) Text, 4.68 KB
Tff7b72#Tff7b72include T8b949e"ClientACL.h"
Tff7b72static Te6edf3File Td2a8ffopenWriteTb4b4b4(Te6edf3FILESYSTEMTff7b72* Te6edf3_fsTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3filenameTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
Te6edf3_fsTff7b72-Tff7b72>Te6edf3removeTb4b4b4(Te6edf3filenameTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3_fsTff7b72-Tff7b72>Te6edf3openTb4b4b4(Te6edf3filenameTb4b4b4, Te6edf3FILE_O_WRITETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(RP2040_PLATFORM)
Tff7b72return Te6edf3_fsTff7b72-Tff7b72>Te6edf3openTb4b4b4(Te6edf3filenameTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72return Te6edf3_fsTff7b72-Tff7b72>Te6edf3openTb4b4b4(Te6edf3filenameTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Tffa657trueTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tffa657void Td2a8ffClientACL::loadTb4b4b4(Te6edf3FILESYSTEMTff7b72* Te6edf3fsTb4b4b4, Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3LocalIdentityTff7b72& Te6edf3self_idTb4b4b4) Tb4b4b4{
Te6edf3_fs Tff7b72= Te6edf3fsTb4b4b4;
Te6edf3num_clients Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3_fsTff7b72-Tff7b72>Te6edf3existsTb4b4b4(Ta5d6ff"Ta5d6ff/s_contactsTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if defined(RP2040_PLATFORM)
Te6edf3File Te6edf3file Tff7b72= Te6edf3_fsTff7b72-Tff7b72>Te6edf3openTb4b4b4(Ta5d6ff"Ta5d6ff/s_contactsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3File Te6edf3file Tff7b72= Te6edf3_fsTff7b72-Tff7b72>Te6edf3openTb4b4b4(Ta5d6ff"Ta5d6ff/s_contactsTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4) Tb4b4b4{
Tffa657bool Te6edf3full Tff7b72= Tffa657falseTb4b4b4;
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3fullTb4b4b4) Tb4b4b4{
Te6edf3ClientInfo Te6edf3cTb4b4b4;
Tffa657uint8_t Te6edf3pub_keyTb4b4b4[T79c0ff32Tb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3unusedTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3memsetTb4b4b4(Tff7b72&Te6edf3cTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4)Tb4b4b4;
Tffa657bool Te6edf3success Tff7b72= Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Te6edf3pub_keyTb4b4b4, T79c0ff32Tb4b4b4) Tff7b72=Tff7b72= T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4) Tff7b72&Te6edf3cTb4b4b4.Te6edf3permissionsTb4b4b4, T79c0ff1Tb4b4b4) Tff7b72=Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4) Tff7b72&Te6edf3cTb4b4b4.Te6edf3extraTb4b4b4.Te6edf3roomTb4b4b4.Te6edf3sync_sinceTb4b4b4, T79c0ff4Tb4b4b4) Tff7b72=Tff7b72= T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Te6edf3unusedTb4b4b4, T79c0ff2Tb4b4b4) Tff7b72=Tff7b72= T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4)Tff7b72&Te6edf3cTb4b4b4.Te6edf3out_path_lenTb4b4b4, T79c0ff1Tb4b4b4) Tff7b72=Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Te6edf3cTb4b4b4.Te6edf3out_pathTb4b4b4, T79c0ff64Tb4b4b4) Tff7b72=Tff7b72= T79c0ff64Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3readTb4b4b4(Te6edf3cTb4b4b4.Te6edf3shared_secretTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; T8b949e// will be recalculated below
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3successTb4b4b4) Tff7b72breakTb4b4b4; T8b949e// EOF
Te6edf3cTb4b4b4.Te6edf3id Tff7b72= Te6edf3meshTff7b72:Tff7b72:Te6edf3IdentityTb4b4b4(Te6edf3pub_keyTb4b4b4)Tb4b4b4;
Te6edf3self_idTb4b4b4.Te6edf3calcSharedSecretTb4b4b4(Te6edf3cTb4b4b4.Te6edf3shared_secretTb4b4b4, Te6edf3pub_keyTb4b4b4)Tb4b4b4; T8b949e// recalculate shared secrets in case our private key changed
Tff7b72if Tb4b4b4(Te6edf3num_clients Tff7b72< Te6edf3MAX_CLIENTSTb4b4b4) Tb4b4b4{
Te6edf3clientsTb4b4b4[Te6edf3num_clientsTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3full Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3fileTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffClientACL::saveTb4b4b4(Te6edf3FILESYSTEMTff7b72* Te6edf3fsTb4b4b4, Tffa657bool Tb4b4b4(Tff7b72*Te6edf3filterTb4b4b4)Tb4b4b4(Te6edf3ClientInfoTff7b72*Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_fs Tff7b72= Te6edf3fsTb4b4b4;
Te6edf3File Te6edf3file Tff7b72= Te6edf3openWriteTb4b4b4(Te6edf3_fsTb4b4b4, Ta5d6ff"Ta5d6ff/s_contactsTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3unusedTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3unusedTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3unusedTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3num_clientsTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72auto Te6edf3c Tff7b72= Tff7b72&Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cTff7b72-Tff7b72>Te6edf3permissions Tff7b72=Tff7b72= T79c0ff0 Tff7b72|Tff7b72| Tb4b4b4(Te6edf3filter Tff7b72&Tff7b72& Tff7b72!Te6edf3filterTb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4; T8b949e// skip deleted entries, or by filter function
Tffa657bool Te6edf3success Tff7b72= Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3cTff7b72-Tff7b72>Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4, T79c0ff32Tb4b4b4) Tff7b72=Tff7b72= T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4) Tff7b72&Te6edf3cTff7b72-Tff7b72>Te6edf3permissionsTb4b4b4, T79c0ff1Tb4b4b4) Tff7b72=Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4) Tff7b72&Te6edf3cTff7b72-Tff7b72>Te6edf3extraTb4b4b4.Te6edf3roomTb4b4b4.Te6edf3sync_sinceTb4b4b4, T79c0ff4Tb4b4b4) Tff7b72=Tff7b72= T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3unusedTb4b4b4, T79c0ff2Tb4b4b4) Tff7b72=Tff7b72= T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4)Tff7b72&Te6edf3cTff7b72-Tff7b72>Te6edf3out_path_lenTb4b4b4, T79c0ff1Tb4b4b4) Tff7b72=Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3cTff7b72-Tff7b72>Te6edf3out_pathTb4b4b4, T79c0ff64Tb4b4b4) Tff7b72=Tff7b72= T79c0ff64Tb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3cTff7b72-Tff7b72>Te6edf3shared_secretTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3successTb4b4b4) Tff7b72breakTb4b4b4; T8b949e// write failed
Tb4b4b4}
Te6edf3fileTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657bool Td2a8ffClientACL::clearTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_fsTb4b4b4) Tff7b72return Tffa657falseTb4b4b4; T8b949e// no filesystem, nothing to clear
Tff7b72if Tb4b4b4(Te6edf3_fsTff7b72-Tff7b72>Te6edf3existsTb4b4b4(Ta5d6ff"Ta5d6ff/s_contactsTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_fsTff7b72-Tff7b72>Te6edf3removeTb4b4b4(Ta5d6ff"Ta5d6ff/s_contactsTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3memsetTb4b4b4(Te6edf3clientsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3clientsTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3num_clients Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Te6edf3ClientInfoTff7b72* Td2a8ffClientACL::getClientTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pubkeyTb4b4b4, Tffa657int Te6edf3key_lenTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3num_clientsTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3memcmpTb4b4b4(Te6edf3pubkeyTb4b4b4, Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3idTb4b4b4.Te6edf3pub_keyTb4b4b4, Te6edf3key_lenTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return Tff7b72&Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; T8b949e// already known
Tb4b4b4}
Tff7b72return Tffa657NULLTb4b4b4; T8b949e// not found
Tb4b4b4}
Te6edf3ClientInfoTff7b72* Td2a8ffClientACL::putClientTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3IdentityTff7b72& Te6edf3idTb4b4b4, Tffa657uint8_t Te6edf3init_permsTb4b4b4) Tb4b4b4{
Tffa657uint32_t Te6edf3min_time Tff7b72= T79c0ff0xFFFFFFFFTb4b4b4;
Te6edf3ClientInfoTff7b72* Te6edf3oldest Tff7b72= Tff7b72&Te6edf3clientsTb4b4b4[Te6edf3MAX_CLIENTS Tff7b72- T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3num_clientsTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3idTb4b4b4.Te6edf3matchesTb4b4b4(Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4) Tff7b72return Tff7b72&Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; T8b949e// already known
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3isAdminTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3last_activity Tff7b72< Te6edf3min_timeTb4b4b4) Tb4b4b4{
Te6edf3oldest Tff7b72= Tff7b72&Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Te6edf3min_time Tff7b72= Te6edf3oldestTff7b72-Tff7b72>Te6edf3last_activityTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3ClientInfoTff7b72* Te6edf3cTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3num_clients Tff7b72< Te6edf3MAX_CLIENTSTb4b4b4) Tb4b4b4{
Te6edf3c Tff7b72= Tff7b72&Te6edf3clientsTb4b4b4[Te6edf3num_clientsTff7b72+Tff7b72+Tb4b4b4]Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3c Tff7b72= Te6edf3oldestTb4b4b4; T8b949e// evict least active contact
Tb4b4b4}
Te6edf3memsetTb4b4b4(Te6edf3cTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Tff7b72*Te6edf3cTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3cTff7b72-Tff7b72>Te6edf3permissions Tff7b72= Te6edf3init_permsTb4b4b4;
Te6edf3cTff7b72-Tff7b72>Te6edf3id Tff7b72= Te6edf3idTb4b4b4;
Te6edf3cTff7b72-Tff7b72>Te6edf3out_path_len Tff7b72= Te6edf3OUT_PATH_UNKNOWNTb4b4b4;
Tff7b72return Te6edf3cTb4b4b4;
Tb4b4b4}
Tffa657bool Td2a8ffClientACL::applyPermissionsTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3LocalIdentityTff7b72& Te6edf3self_idTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pubkeyTb4b4b4, Tffa657int Te6edf3key_lenTb4b4b4, Tffa657uint8_t Te6edf3permsTb4b4b4) Tb4b4b4{
Te6edf3ClientInfoTff7b72* Te6edf3cTb4b4b4;
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3perms Tff7b72& Te6edf3PERM_ACL_ROLE_MASKTb4b4b4) Tff7b72=Tff7b72= Te6edf3PERM_ACL_GUESTTb4b4b4) Tb4b4b4{ T8b949e// guest role is not persisted in contacts
Te6edf3c Tff7b72= Te6edf3getClientTb4b4b4(Te6edf3pubkeyTb4b4b4, Te6edf3key_lenTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3c Tff7b72=Tff7b72= Tffa657NULLTb4b4b4) Tff7b72return Tffa657falseTb4b4b4; T8b949e// partial pubkey not found
Te6edf3num_clientsTff7b72-Tff7b72-Tb4b4b4; T8b949e// delete from contacts[]
Tffa657int Te6edf3i Tff7b72= Te6edf3c Tff7b72- Te6edf3clientsTb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3num_clientsTb4b4b4) Tb4b4b4{
Te6edf3clientsTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3clientsTb4b4b4[Te6edf3i Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3iTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3key_len Tff7b72< Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72return Tffa657falseTb4b4b4; T8b949e// need complete pubkey when adding/modifying
Te6edf3meshTff7b72:Tff7b72:Te6edf3Identity Te6edf3idTb4b4b4(Te6edf3pubkeyTb4b4b4)Tb4b4b4;
Te6edf3c Tff7b72= Te6edf3putClientTb4b4b4(Te6edf3idTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3cTff7b72-Tff7b72>Te6edf3permissions Tff7b72= Te6edf3permsTb4b4b4; T8b949e// update their permissions
Te6edf3self_idTb4b4b4.Te6edf3calcSharedSecretTb4b4b4(Te6edf3cTff7b72-Tff7b72>Te6edf3shared_secretTb4b4b4, Te6edf3pubkeyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.1s